1️⃣ Introducción

Este análisis tiene como objetivo calcular probabilidades condicionales en el dataset de Airbnb, respondiendo preguntas como:

Estos cálculos son clave para entender patrones de precios y disponibilidad en distintos barrios de la ciudad.

2️⃣ Carga de Librerías y Configuración

install.packages("here",dependencies = TRUE)
library(here)           # Manejo de rutas dinámicas
source(here("reportes/Proy_Airbnb/00_CONFIGURACION.r"))
# 📌 Cargar librerías necesarias
library(janitor)        # Limpieza de nombres de columnas
library(summarytools)   # Resumen estadístico detallado
library(ggplot2)        # Gráficos
library(dplyr)          # Manipulación de datos
library(plotly)         # Gráficos Interactivos

# 📌 Configuración de gráficos globales
theme_set(theme_minimal())

# 📌 Cargar scripts de preprocesamiento
source(here("scripts/utils.r"))
source(here("scripts/1_preprocesamiento_esp_dataset.r"))
source(here("scripts/3_analisis_probabilidad.r"))
# 📌 Cargar dataset limpio
airbnb_data <- preprocesar_datos(here("datasets/listings_filtered.csv"), "Airbnb")
## 📥 Cargando datos del proyecto: Airbnb 
## 🧹 Realizando limpieza de datos...
## 📊 Aplicando preprocesamiento específico para Airbnb...
## ✅ Preprocesamiento completado para: Airbnb

3️⃣ Cálculo de Probabilidades Condicionales

En esta sección analizamos la relación entre tipo de alojamiento, precios y disponibilidad, aplicando cálculos de probabilidad condicional.

📌 Probabilidad de que un alojamiento tenga un precio accesible (<1000) en barrios seleccionados

barrios_seleccionados <- c("Cuauhtémoc","Álvaro Obregón","Azcapotzalco") 

# Calcular probabilidades
resultados_precio_barrio <- calcular_probabilidades(
  data = airbnb_data %>% filter(neighbourhood_cleansed %in% barrios_seleccionados),
  condicionante = "neighbourhood_cleansed",
  objetivo = "price",
  bins = 5  # Dividir el precio en intervalos
)

# Mostrar resultados
cat("Tabla de contingencia:\n")
## Tabla de contingencia:
print(resultados_precio_barrio$tabla_contingencia)
## # A tibble: 5 × 3
##   neighbourhood_cleansed price                   n
##   <fct>                  <fct>               <int>
## 1 Álvaro Obregón         [-82.1,4.05e+04]      390
## 2 Azcapotzalco           [-82.1,4.05e+04]      123
## 3 Cuauhtémoc             [-82.1,4.05e+04]     5455
## 4 Cuauhtémoc             (4.05e+04,8.1e+04]      1
## 5 Cuauhtémoc             (1.62e+05,2.02e+05]     3
cat("\nProbabilidades condicionales:\n")
## 
## Probabilidades condicionales:
print(resultados_precio_barrio$probabilidades_condicionales)
## # A tibble: 5 × 4
##   neighbourhood_cleansed price                   n prob_condicional
##   <fct>                  <fct>               <int>            <dbl>
## 1 Álvaro Obregón         [-82.1,4.05e+04]      390         1       
## 2 Azcapotzalco           [-82.1,4.05e+04]      123         1       
## 3 Cuauhtémoc             [-82.1,4.05e+04]     5455         0.999   
## 4 Cuauhtémoc             (4.05e+04,8.1e+04]      1         0.000183
## 5 Cuauhtémoc             (1.62e+05,2.02e+05]     3         0.000550
cat("\nProbabilidades marginales de precio:\n")
## 
## Probabilidades marginales de precio:
print(resultados_precio_barrio$probabilidades_marginales)
## # A tibble: 3 × 3
##   price                   n prob_marginal
##   <fct>               <int>         <dbl>
## 1 [-82.1,4.05e+04]     5968      0.999   
## 2 (4.05e+04,8.1e+04]      1      0.000167
## 3 (1.62e+05,2.02e+05]     3      0.000502

📌 Probabilidad de que un alojamiento tenga más de 3 baños dado que su precio es alto .

# 📌 Definir los bins para cada variable
bins_price <- seq(0, max(airbnb_data$price, na.rm = TRUE), by = 100)  # Intervalos de 100 USD
bins_bathrooms <- seq(0, max(airbnb_data$bathrooms, na.rm = TRUE), by = 0.5)  # Intervalos de 0.5 baños

# 📌 Transformar los datos antes de calcular probabilidades
airbnb_data_binned <- airbnb_data %>%
  filter(price > 0, price < 1000,neighbourhood_cleansed %in% barrios_seleccionados) %>%  # Filtrando valores extremos
  mutate(
    price = cut(price, breaks = bins_price, include.lowest = TRUE),  # Convertir en categorías
    bathrooms = cut(bathrooms, breaks = bins_bathrooms, include.lowest = TRUE)  # Convertir en categorías
  )

# 📌 Calcular la probabilidad condicional de baños dado el precio
resultados_bathrooms_vs_price <- calcular_probabilidades(
  data = airbnb_data_binned,  # Dataset con variables discretizadas
  condicionante = "price",  # Precio del alojamiento
  objetivo = "bathrooms"  # Número de baños
)

# 📌 Mostrar resultados corregidos
cat("Tabla de contingencia:\n")
## Tabla de contingencia:
print(resultados_bathrooms_vs_price$tabla_contingencia)
## # A tibble: 53 × 3
##    price     bathrooms     n
##    <fct>     <fct>     <int>
##  1 (100,200] (0.5,1]       5
##  2 (100,200] (2,2.5]       4
##  3 (100,200] (4.5,5]       1
##  4 (200,300] [0,0.5]       1
##  5 (200,300] (0.5,1]      60
##  6 (200,300] (1,1.5]       5
##  7 (200,300] (1.5,2]       9
##  8 (200,300] (2,2.5]       2
##  9 (200,300] (2.5,3]       2
## 10 (200,300] (3,3.5]       1
## # ℹ 43 more rows
cat("\nProbabilidades condicionales:\n")
## 
## Probabilidades condicionales:
print(resultados_bathrooms_vs_price$probabilidades_condicionales)
## # A tibble: 53 × 4
##    price     bathrooms     n prob_condicional
##    <fct>     <fct>     <int>            <dbl>
##  1 (100,200] (0.5,1]       5           0.5   
##  2 (100,200] (2,2.5]       4           0.4   
##  3 (100,200] (4.5,5]       1           0.1   
##  4 (200,300] [0,0.5]       1           0.0118
##  5 (200,300] (0.5,1]      60           0.706 
##  6 (200,300] (1,1.5]       5           0.0588
##  7 (200,300] (1.5,2]       9           0.106 
##  8 (200,300] (2,2.5]       2           0.0235
##  9 (200,300] (2.5,3]       2           0.0235
## 10 (200,300] (3,3.5]       1           0.0118
## # ℹ 43 more rows
cat("\nProbabilidades marginales de baños:\n")
## 
## Probabilidades marginales de baños:
print(resultados_bathrooms_vs_price$probabilidades_marginales)
## # A tibble: 12 × 3
##    bathrooms     n prob_marginal
##    <fct>     <int>         <dbl>
##  1 [0,0.5]      11      0.00607 
##  2 (0.5,1]    1478      0.816   
##  3 (1,1.5]     141      0.0779  
##  4 (1.5,2]     109      0.0602  
##  5 (2,2.5]      36      0.0199  
##  6 (2.5,3]      17      0.00939 
##  7 (3,3.5]       3      0.00166 
##  8 (3.5,4]      11      0.00607 
##  9 (4.5,5]       1      0.000552
## 10 (5.5,6]       1      0.000552
## 11 (7.5,8]       2      0.00110 
## 12 (12.5,13]     1      0.000552

📊 Visualización: Probabilidad de Tipo de Habitación por Barrio

p_room_type_barrio <- visualizar_probabilidad_condicional(
  data = airbnb_data %>% filter(neighbourhood_cleansed %in% barrios_seleccionados),
  condicionante = "neighbourhood_cleansed",
  objetivo = "room_type",
  titulo = "Probabilidad de Tipo de Habitación por Barrio en Airbnb",
  xlab = "Barrio",
  guardar = TRUE,
  ruta_guardado = here("reportes/Proy_Airbnb/resultados_generados/probabilidad_condicional_room_type_barrio.png")
)

p_room_type_barrio

📊 Visualización: Probabilidad de Precio por Barrio

p_precio_barrio <- visualizar_probabilidad_condicional(
  data = airbnb_data %>% filter(neighbourhood_cleansed %in% barrios_seleccionados),
  condicionante = "neighbourhood_cleansed",
  objetivo = "price",
  titulo = "Probabilidad de Precio por Barrio en Airbnb",
  xlab = "Barrio",
  guardar = TRUE,
  ruta_guardado = here("reportes/Proy_Airbnb/resultados_generados/probabilidad_condicional_precio_barrio.png"),
  bins = seq(0, max(airbnb_data$price, na.rm = TRUE), by = 100)
)

p_precio_barrio

📊 Visualización: Probabilidad de Número de Baños dado el Precio

p_bathrooms_price <- visualizar_probabilidad_condicional(
  data = airbnb_data_binned,
  condicionante = "price",
  objetivo = "bathrooms",
  titulo = "Probabilidad de Número de Baños dado el Precio en Airbnb",
  xlab = "Precio (USD)",
  guardar = TRUE,
  ruta_guardado = here("reportes/Proy_Airbnb/resultados_generados/probabilidad_condicional_bathrooms_vs_price.png"),
  bins = bins_price
)

# Ajustar etiquetas del eje X en plotly
p_bathrooms_price <- p_bathrooms_price %>% layout(xaxis = list(tickangle = 90))

# Mostrar el gráfico interactivo
p_bathrooms_price

✅ Conclusión

Hemos aplicado cálculos de probabilidad condicional para explorar la relación entre precios, número de baños, barrios y tipo de habitación en Airbnb. Estas visualizaciones permiten una mejor interpretación de los datos para decisiones de inversión o análisis de tendencias.